/**
 java解析XML通常有两种方式，DOM和SAX
 DOM：Document object Model(文档对象模型）
 dom的特点：
 定义一组java接口，基于对象，与语言和平台无关将XML文档表示为树，
 在内存中解析和存储XML文件，允许随机访问文档的不同部分
 DOM解析XML
 DOM的有点，由于树在内存中是持久的，因此可以修改后更新。
 它还可以在任何时候在书中上下导航，api使用起来也比较简单
 */
package 第十七章_XML与JSON.XML_DOM;


import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;

public class Dom_run {
    @Test
    public void run() throws ParserConfigurationException, IOException, SAXException {
        //1.创建一个DOM解析工厂对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //2.通过工厂对象创建解析器对象
        DocumentBuilder documentBuilder = factory.newDocumentBuilder();
        //3.读取输入流
        InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("第十七章_XML与JSON/XML_DOM/People.xml");
        //此代码完成后，整个XML文件已经被加载到内存中，以树状形式存储
        Document doc = documentBuilder.parse(is);
        //获取节点名称为person的所有节点，返回节点集合 (范围是tag 和/tag 之间的所有节点包括子节点  和其他平行的 同名节点
        NodeList personNodeList = doc.getElementsByTagName("person");
        //容器用来装封装格式类的对象
        ArrayList<Person> persons = new ArrayList<>();
        //封装格式类
        Person p = null;
        for (int i = 0; i < personNodeList.getLength(); i++) {
            Node personNode = personNodeList.item(i);
            p = new Person();
            //获取节点的属性值 < > 标签里面 蓝色的部分
            String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
            p.setPersonid(personid);

            NodeList childNodes = personNode.getChildNodes();
            for(int j=0;j<childNodes.getLength();j++){
                Node item=childNodes.item(j);
                String nodeName = item.getNodeName();
                switch (nodeName) {
                    case "name":
                        p.setName(item.getFirstChild().getNodeValue());
                        break;
                    case "address":
                        p.setAddress(item.getFirstChild().getNodeValue());
                        break;
                    case "tel":
                        p.setTel(item.getFirstChild().getNodeValue());
                        break;
                    case "fax":
                        p.setFax(item.getFirstChild().getNodeValue());
                        break;
                    case "email":
                        p.setEmail(item.getFirstChild().getNodeValue());
                        break;
                }
            }
            persons.add(p);
        }
        System.out.println("结果是: ");
        //这个转成一个数组
        System.out.println(Arrays.toString(persons.toArray()));
        //这个转成2条数据
        Arrays.stream(persons.toArray()).forEach(System.out::println);
    }
}
